import useUserStore from "@/store/modules/user";
import axios from "axios";
import { ElMessage, ElNotification, ElLoading } from "element-plus";
import { Base64 } from "js-base64";
// 创建axios实例
let request = axios.create({
    // baseURL: "/mock",
    baseURL: import.meta.env.VITE_APP_BASE_API,
    timeout:5000
})
// 加密token方法
function baseFun(){
    const token = localStorage.getItem("VUE3-TOKEN");
    const base64 = Base64.encode(token+":")
    return 'Basic ' + base64
}
// 获取当前登录的用户所属的角色最新权限
const getMenus = ()=>{
    const userStore = useUserStore();
    // 当前登录用户的角色id
    const roleId = userStore.user?.role_id;
    // 获取当前项目中存储登录的用户权限列表
    const userMenus = userStore.user?.role?.menus;
    if(userStore.user?.username == "admin"){
        return;
    }
    // 非超级管理员，发送请求获取最新的权限数组，和本地存储的进行比对，如果不一样就退出登录
    request({
        url:"/menus",
        method:"post",
        data:{
            roleId,
        },
    }).then((resp)=>{
        if(resp.status == 0){
            // 服务器返回的权限列表
            const menus = resp.data.menus;
            // 判断服务器返回的权限列表和本地存储的权限列表，如果个数不相同就代表修改过
            if(userMenus?.length == menus.length){
                // 长度相同，再判断里面的元素是否相同
                // 循环遍历本地存储的权限列表，遍历的同时查看当前元素(权限)是否在服务器返回的权限列表中存在，如果不存在就退出登录
                userMenus?.forEach((item)=>{
                    if(menus.indexOf(item) == -1){
                        userStore.removeUser();
                        ElNotification({
                            title: '警告',
                            message: '当前登录的用户的权限被修改了，请重新登录',
                            type: 'warning',
                        });
                        // 跳回登录页面
                        window.location.href = "/login";
                    }
                })
            }else{
                userStore.removeUser()
                ElNotification({
                    title: '警告',
                    message: '当前登录的用户的权限被修改了，请重新登录',
                    type: 'warning',
                });
                // 跳回登录页面
                window.location.href = "/login";
            }
        }
    });
};
// 加载效果对象
const loading = {
    loadingInstance: null, // 实例对象
    open(){
        if(this.loadingInstance == null){
            //@ts-ignore
            this.loadingInstance = ElLoading.service({
                text:"玩命加载中...",
                background:'rgba(0,0,0,0.5)',
                target: '.main'
            })
        }
    },
    close(){
        if(this.loadingInstance != null){
            //@ts-ignore
            this.loadingInstance.close()
        }
        this.loadingInstance = null
    }
}
// 请求拦截器
request.interceptors.request.use(
    function (config) {
        // 从本地获取token
        const token = localStorage.getItem("VUE3-TOKEN");
        if(token){
            // 将加密之后的token设置到请求头中
            config.headers.Authorization = baseFun()
        }
        console.log(config.url);
        
        if(config.url != "/menus" && config.url != "/login"){
            loading.open()
            getMenus()
        }
        // config配置对象中的headers属性代表请求头，可以给服务器端携带公共参数
        return config;
        }, function (error) {
            loading.close()
        // Do something with request error
        return Promise.reject(error);
  });

// 响应拦截器
request.interceptors.response.use(function (response) {
    // Any status code that lie within the range of 2xx cause this function to trigger
    // Do something with response data
    const resp = response.data
    if(resp.status != 0){
        ElNotification({
            title:"警告!",
            //@ts-ignore
            message: response.msg,
            type: 'error'
        })
    }
    loading.close()
    return response.data;
  }, function (error) {
    loading.close()
    // 失败的回调，处理http网络错误
    // 定义变量用来存储网络的错误信息
    let msg = '';
    let status = error.response.status;
    switch (status) {
        case 401:
            msg = "token过期"
            break;
        case 403:
            msg = "无权访问"
            break;
        case 404:
            msg = "请求地址错误"
            break;
        case 500:
            msg = "服务器出现问题"
            break;
        default:
            msg = "无网络"
    }
    // 提示错误信息
    ElMessage({
        type:'error',
        message: msg
    })
    return Promise.reject(error);
  });
  // 对外暴露
  export default request